<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // let a  = [
        //     30,
        //     20,
        //     10,
        //     18
        // ]
        // let b  = [
        //     18,
        //     10,
        //     20,
        //     30
        // ]

        // // 数组内简单数据类型
        // function compare (arr1, arr2) {
        //     // 先比较数据类型 是否都为数组
        //     if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false
        //     // 比较长度
        //     if (arr1.length !== arr2.length) return false
        //     // 比较内容
        //     return arr1.map(item => arr2.includes(item)).every(item => item)
        // }
        // let ac = compare(a, b)
        // console.log(ac);

        // 数组内复杂数据类型
        function compare2 (arr1, arr2) {
            if (arr1 === null || arr2 ===null) return arr1 === arr2
            // 先比较类型
            if (typeof arr1 !== 'object' && typeof arr2 !== 'object') return arr1 === arr2
            // 比较长度
            if (arr1.length !== arr2.length) return false
            // 循环数组1 在 数组2内查找
            if (Array.isArray(arr1) && Array.isArray(arr2)){
                return arr1.map(item => {
                if (Array.isArray(item)) {
                    // 循环当前项是数组
                    // 实现逻辑 概述  先筛选 arr2 中为数组的元素 递归同arr1做比较 有一项返回为true 则返回为 true some方法
                    let filterArr = arr2.filter(item => Array.isArray(arr2))
                    return filterArr.map(i => {
                    return compare2(i, item)
                    }).some(a => a)
                } else if (typeof item === 'object' && !(item instanceof Function)) {
                    // 当前循环项目为对象
                    // 实现逻辑概述  先筛选为对象的元素
                    let filterArr = arr2.filter(a => typeof a === 'object' && !Array.isArray(a) && !(a instanceof Function))
                    return filterArr.map(i => {
                      return compare2(i, item)
                    }).some(a => a)
                } else {
                    return arr2.includes(item)
                }
                }).every(a => a)
            } 
            else {
              // 为对象
              if (!(Object.keys(arr1).length === Object.keys(arr2).length)) return false
              if (!compare2(Object.keys(arr1), Object.keys(arr2))) return false
              return Object.keys(arr1).map(i => compare2(arr1[i], arr2[i])).every(a => a)
            }
        }

        let arrA = [
          { a: 1, b: 2, c: 3, z: null, r: '', children: [
            { a: 10, b: 20 },
            { a: 11, b: 22 },
          ]},
          { a: 10, b: 2, c: 3, children: [
            { a: 10, b: 20 },
            { a: 11, b: 22 },
          ]},
          { a: 100, b: 2, c: 3, children: [
            { a: 100, b: 20 },
            { a: 111, b: 22 },
          ]},
        ]

        let arrB = [
          { a: 1, b: 2, c: 3, z: null, r: '', children: [
            { a: 10, b: 20 },
            { a: 11, b: 22 },
          ]},
          { a: 10, b: 2, c: 3, children: [
            { a: 10, b: 20 },
            { a: 11, b: 22 },
          ]},
          { a: 100, b: 2, c: 3, children: [
            { a: 100, b: 20 },
            { a: 111, b: 22 },
          ]},
        ]

        let c = compare2(arrA, arrB)
        alert(c ? '相等' : '不等')
        // console.log(c)




        </script>
</body>
</html>